/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

 // 后序
 // 左 右 中
 // 中 右 左
func postorderTraversal(root *TreeNode) []int {
    res := []int{}
    if root == nil {
        return res
    }

    // 初始化 栈
    st := list.New()
    st.PushBack(root)

    // 处理栈
    for st.Len() > 0 {
        // 拿到最后一个节点
        e := st.Remove(st.Back())
        // 如果带nil标记就将下一个元素放入结果集
        if e == nil {
            node := st.Remove(st.Back()).(*TreeNode)
            res = append(res, node.Val)
            // 进入下一次循环
            continue
        }
        // 转为节点
        node := e.(*TreeNode)
        // 中节点放入栈, 并标记节点
        st.PushBack(node)
        st.PushBack(nil)
        // 右节点放入栈
        if node.Right != nil {
            st.PushBack(node.Right)
        }
        // 左节点放入栈
        if node.Left != nil {
            st.PushBack(node.Left)
        }
    }
    return res
}